1 using UnityEngine;
2
3 namespace ProceduralToolkit
4 {
5 /// <summary>
6 /// Vector extensions
7 /// </summary>
8 public static class VectorE
9 {
10 private const float epsilon = 0.00001f;
11
12 #region Vector2
13
14 /// <summary>
15 /// Returns new vector with zero Y component
16 /// </summary>
17 public static Vector2 OnlyX(this Vector2 vector)
18 {
19 return new Vector2(vector.x, 0);
20 }
21
22 /// <summary>
23 /// Returns new vector with zero X component
24 /// </summary>
25 public static Vector2 OnlyY(this Vector2 vector)
26 {
27 return new Vector2(0, vector.y);
28 }
29
30 /// <summary>
31 /// Projects vector onto three dimensional XY plane
32 /// </summary>
33 public static Vector3 ToVector3XY(this Vector2 vector)
34 {
35 return new Vector3(vector.x, vector.y, 0);
36 }
37
38 /// <summary>
39 /// Projects vector onto three dimensional XZ plane
40 /// </summary>
41 public static Vector3 ToVector3XZ(this Vector2 vector)
42 {
43 return new Vector3(vector.x, 0, vector.y);
44 }
45
46 /// <summary>
47 /// Projects vector onto three dimensional YZ plane
48 /// </summary>
49 public static Vector3 ToVector3YZ(this Vector2 vector)
50 {
51 return new Vector3(0, vector.x, vector.y);
52 }
53
54 /// <summary>
55 /// Returns true if vectors lie on the same line, false otherwise
56 /// </summary>
57 public static bool IsCollinear(this Vector2 vector, Vector2 other)
58 {
59 return Mathf.Abs(PTUtils.PerpDot(vector, other)) < epsilon;
60 }
61
62 /// <summary>
63 /// Returns new vector rotated clockwise by specified angle
64 /// </summary>
65 public static Vector2 RotateCW(this Vector2 vector, float degrees)
66 {
67 float radians = degrees*Mathf.Deg2Rad;
68 float sin = Mathf.Sin(radians);
69 float cos = Mathf.Cos(radians);
70 return new Vector2(
71 vector.x*cos + vector.y*sin,
72 -vector.x*sin + vector.y*cos);
73 }
74
75 #endregion Vector2
76
77 #region Vector3
78
79 /// <summary>
80 /// Returns new vector with zero Y and Z components
81 /// </summary>
82 public static Vector3 OnlyX(this Vector3 vector)
83 {
84 return new Vector3(vector.x, 0, 0);
85 }
86
87 /// <summary>
88 /// Returns new vector with zero X and Z components
89 /// </summary>
90 public static Vector3 OnlyY(this Vector3 vector)
91 {
92 return new Vector3(0, vector.y, 0);
93 }
94
95 /// <summary>
96 /// Returns new vector with zero X and Y components
97 /// </summary>
98 public static Vector3 OnlyZ(this Vector3 vector)
99 {
100 return new Vector3(0, 0, vector.z);
101 }
102
103 /// <summary>
104 /// Returns new vector with zero Z component
105 /// </summary>
106 public static Vector3 OnlyXY(this Vector3 vector)
107 {
108 return new Vector3(vector.x, vector.y, 0);
109 }
110
111 /// <summary>
112 /// Returns new vector with zero Y component
113 /// </summary>
114 public static Vector3 OnlyXZ(this Vector3 vector)
115 {
116 return new Vector3(vector.x, 0, vector.z);
117 }
118
119 /// <summary>
120 /// Returns new vector with zero X component
121 /// </summary>
122 public static Vector3 OnlyYZ(this Vector3 vector)
123 {
124 return new Vector3(0, vector.y, vector.z);
125 }
126
127 #endregion Vector3
128 }
129 }